lowranceusr: Use gbfile API. Fix read/write of names and comments. Check for buffer...
authoroliskoli <oliskoli>
Fri, 8 Feb 2008 23:51:33 +0000 (23:51 +0000)
committeroliskoli <oliskoli>
Fri, 8 Feb 2008 23:51:33 +0000 (23:51 +0000)
lowranceusr.c

index 308805b1661e988f123ec6ce63e4bc0b1e0b8eaa..86394ca415e5b89287bb7c6154afeef125313416 100644 (file)
@@ -23,6 +23,9 @@
        6/21/05 - Ling Nero (rnlnero@yahoo.com)
        - Added Routes, Icons, & Tracks support
        - Fixed waypoint date/time stamp conversion
+       02/09/08 - oliskoli
+       - gbfile API
+       - check for buffer overflows when reading names or comments
 */
 
 
@@ -31,8 +34,8 @@
 #include <math.h> /* for lat/lon conversion */
 
 typedef struct lowranceusr_icon_mapping {
-       const long int  value;
-       const char              *icon;
+       const int       value;
+       const char      *icon;
 } lowranceusr_icon_mapping_t;
 
 #define DEF_ICON 10001
@@ -158,8 +161,8 @@ const lowranceusr_icon_mapping_t lowranceusr_icon_value_table[] = {
        {        -1, NULL }
 };
 
-static FILE *file_in;
-static FILE *file_out;
+static gbfile *file_in;
+static gbfile *file_out;
 static short_handle mkshort_handle;
 
 static unsigned short waypt_out_count;
@@ -186,20 +189,20 @@ static char *seg_break;
 /* Jan 1, 2000 00:00:00 */
 const time_t base_time_secs = 946706400;
 
-static
-size_t
-my_fwrite4(int *ptr, FILE *stream)
+static int
+lowranceusr_readstr(char *buf, const int maxlen, gbfile *file)
 {
-        int i = le_read32(ptr);
-        return fwrite(&i, 4, 1, stream);
-}
+       int org, len;
+       
+       org = len = gbfgetint32(file);
+       if (len < 0) fatal(MYNAME ": Invalid item length (%d)!\n", len);
+       else if (len) {
+               if (len > maxlen) len = maxlen;
+               (void) gbfread(buf, 1, len, file);
+               if (org > maxlen) (void) gbfseek(file, org - maxlen, SEEK_CUR);
+       }
 
-static
-size_t
-my_fwrite2(short *ptr, FILE *stream)
-{
-       short i = le_read16(ptr);
-       return fwrite(&i, 2, 1, stream);
+       return len;
 }
 
 const char *
@@ -216,7 +219,7 @@ lowranceusr_find_desc_from_icon_number(const int icon)
        return "";
 }
 
-long int
+int
 lowranceusr_find_icon_number_from_desc(const char *desc)
 {
        const lowranceusr_icon_mapping_t *i;
@@ -244,20 +247,6 @@ lowranceusr_find_icon_number_from_desc(const char *desc)
 
        return DEF_ICON;
 }
-static int
-lowranceusr_fread(void *buff, size_t size, size_t members, FILE * fp) 
-{
-       size_t br;
-
-       br = fread(buff, size, members, fp);
-
-       if (br != members) {
-               fatal(MYNAME ": requested to read %lu bytes, read %lu bytes.\n", 
-                           (unsigned long) members, (unsigned long) br);
-       }
-
-       return (br);
-}
 
 static
 arglist_t lowranceusr_args[] = {
@@ -275,19 +264,19 @@ arglist_t lowranceusr_args[] = {
 static void
 rd_init(const char *fname)
 {
-       file_in = xfopen(fname, "rb", MYNAME);
+       file_in = gbfopen_le(fname, "rb", MYNAME);
 }
 
 static void
 rd_deinit(void)
 {
-       fclose(file_in);
+       gbfclose(file_in);
 }
 
 static void
 wr_init(const char *fname)
 {
-       file_out = xfopen(fname, "wb", MYNAME);
+       file_out = gbfopen_le(fname, "wb", MYNAME);
        mkshort_handle = mkshort_new_handle();
        waypt_out_count = 0;
 }
@@ -295,7 +284,7 @@ wr_init(const char *fname)
 static void
 wr_deinit(void)
 {
-       fclose(file_out);
+       gbfclose(file_out);
        mkshort_del_handle(&mkshort_handle);
 }
 
@@ -327,54 +316,46 @@ static void
 lowranceusr_parse_waypt(waypoint *wpt_tmp)
 {
        char buff[MAXUSRSTRINGSIZE + 1];
-       long int TextLen;
+       int text_len;
        time_t waypt_time;
        short waypt_type;
 
-       lowranceusr_fread(&buff[0], 4, 1, file_in);
-       wpt_tmp->latitude = lat_mm_to_deg(le_read32(&buff[0]));
-       lowranceusr_fread(&buff[0], 4, 1, file_in);
-       wpt_tmp->longitude = lon_mm_to_deg(le_read32(&buff[0]));
-       lowranceusr_fread(&buff[0], 4, 1, file_in);
-       wpt_tmp->altitude = FEET_TO_METERS(le_read32(&buff[0]));
+       wpt_tmp->latitude = lat_mm_to_deg(gbfgetint32(file_in));
+       wpt_tmp->longitude = lon_mm_to_deg(gbfgetint32(file_in));
+       wpt_tmp->altitude = FEET_TO_METERS(gbfgetint32(file_in));
        if (wpt_tmp->altitude <= UNKNOWN_USR_ALTITUDE) {
                wpt_tmp->altitude = unknown_alt;
        }
-       lowranceusr_fread(&buff[0], 4, 1, file_in);
-       TextLen = buff[0];
-       if (TextLen)
-               lowranceusr_fread(&buff[0], TextLen, 1, file_in);
-       buff[TextLen] = '\0';
-       wpt_tmp->shortname = xstrdup(buff);
-
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE parse_waypt: Waypt name = %s Lat = %f Lon = %f alt = %f\n",wpt_tmp->shortname, wpt_tmp->latitude,
+       text_len = lowranceusr_readstr(&buff[0], MAXUSRSTRINGSIZE, file_in);
+       if (text_len) {
+               buff[text_len] = '\0';
+               wpt_tmp->shortname = xstrdup(buff);
+       }
+
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " parse_waypt: Waypt name = %s Lat = %f Lon = %f alt = %f\n",wpt_tmp->shortname, wpt_tmp->latitude,
                        wpt_tmp->longitude, wpt_tmp->altitude);
 
-       lowranceusr_fread(&buff[0], 4, 1, file_in);
-       TextLen = buff[0];
-       if (TextLen) {
-               lowranceusr_fread(&buff[0], TextLen, 1, file_in);
-               buff[TextLen] = '\0';
+       text_len = lowranceusr_readstr(&buff[0], MAXUSRSTRINGSIZE, file_in);
+       if (text_len) {
+               buff[text_len] = '\0';
                wpt_tmp->description = xstrdup(buff);
        }
-       lowranceusr_fread(&buff[0], 4, 1, file_in);
        /* Time is number of seconds since Jan. 1, 2000 */
-       waypt_time = le_read32(&buff[0]);
+       waypt_time = gbfgetint32(file_in);
        if (waypt_time)
                wpt_tmp->creation_time = base_time_secs + waypt_time;
 
-    if (global_opts.debug_level >= 2)
+       if (global_opts.debug_level >= 2)
        {
-               printf("LOWRANCE parse_waypt: creation time %d\n", 
+               printf(MYNAME " parse_waypt: creation time %d\n", 
                        (int)wpt_tmp->creation_time);
-               printf("LOWRANCE parse_waypt: base_time %d\n", (int)base_time_secs);
-               printf("LOWRANCE parse_waypt: waypt time %d\n", (int)waypt_time);
+               printf(MYNAME " parse_waypt: base_time %d\n", (int)base_time_secs);
+               printf(MYNAME " parse_waypt: waypt time %d\n", (int)waypt_time);
        }
 
        /* Symbol ID */
-       lowranceusr_fread(&buff[0], 4, 1, file_in);
-       wpt_tmp->icon_descr = lowranceusr_find_desc_from_icon_number(le_read32(&buff[0]));
+       wpt_tmp->icon_descr = lowranceusr_find_desc_from_icon_number(gbfgetint32(file_in));
        if (!wpt_tmp->icon_descr[0]) {
                char nbuf[10];
                snprintf(nbuf, sizeof(nbuf), "%d", le_read32(buff));
@@ -383,10 +364,9 @@ lowranceusr_parse_waypt(waypoint *wpt_tmp)
        }
 
        /* Waypoint Type (USER, TEMPORARY, POINT_OF_INTEREST) */
-       lowranceusr_fread(&buff[0], 2, 1, file_in);
-       waypt_type = le_read16(&buff[0]);
-    if (global_opts.debug_level >= 1)
-               printf("LOWRANCEUSR parse_waypt: waypt_type = %d\n",waypt_type);
+       waypt_type = gbfgetint16(file_in);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " parse_waypt: waypt_type = %d\n",waypt_type);
 
 }
 
@@ -398,14 +378,13 @@ lowranceusr_parse_routes(void)
        char buff[MAXUSRSTRINGSIZE + 1];
        short int num_routes, num_legs;
        int i,j;
-       long int text_len;
+       int text_len;
        waypoint *wpt_tmp;
 
-       lowranceusr_fread(&buff[0], 2, 1, file_in);
-       num_routes = le_read16(&buff[0]);
+       num_routes = gbfgetint16(file_in);
 
-    if (global_opts.debug_level >= 1)
-               printf("LOWRANCAE parse_routes: Num Routes = %d\n", num_routes);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " parse_routes: Num Routes = %d\n", num_routes);
 
        for (i=0; i < num_routes; i++)
        {
@@ -414,22 +393,19 @@ lowranceusr_parse_routes(void)
                rte_head->rte_num = i+1;
 
                /* route name */
-               lowranceusr_fread(&buff[0], 4, 1, file_in);
-               text_len = buff[0];
+               text_len = lowranceusr_readstr(&buff[0], MAXUSRSTRINGSIZE, file_in);
                if (text_len)
                {
-                       lowranceusr_fread(&buff[0], text_len, 1, file_in);
                        buff[text_len] = '\0';
+                       rte_head->rte_name = xstrdup(buff);
                }
-               rte_head->rte_name = xstrdup(buff);
-               rte_head->rte_desc = '\0';
+               rte_head->rte_desc = '\0';      /* ???????? */
 
                /* num Legs */
-               lowranceusr_fread(&buff[0], 2, 1, file_in);
-               num_legs = le_read16(&buff[0]);
+               num_legs = gbfgetint16(file_in);
 
                /* route reversed */
-               lowranceusr_fread(&buff[0], 1, 1, file_in);
+               (void) gbfread(&buff[0], 1, 1, file_in);
 
                /* waypoints */
                for (j=0; j < num_legs; j++)
@@ -452,20 +428,19 @@ lowranceusr_parse_icons(void)
        short int num_icons;
        int i;
 
-       lowranceusr_fread(&buff[0], 2, 1, file_in);
-       num_icons = le_read16(&buff[0]);
+       num_icons = gbfgetint16(file_in);
 
-    if (global_opts.debug_level >= 1)
-               printf("LOWRANCE parse_icons: num Icons = %d\n", num_icons);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " parse_icons: num Icons = %d\n", num_icons);
 
        for (i=0; i < num_icons; i++)
        {
                if (ignoreicons)
                {
                        /* position coord lat & long */
-                       lowranceusr_fread(&buff[0], 4, 2, file_in);
+                       (void) gbfread(&buff[0], 4, 2, file_in);
                        /* symbol */
-                       lowranceusr_fread(&buff[0], 4, 1, file_in);
+                       (void) gbfread(&buff[0], 4, 1, file_in);
                }
                else
                {
@@ -473,16 +448,13 @@ lowranceusr_parse_icons(void)
                        wpt_tmp = waypt_new();
 
                        /* position coord lat & long */
-                       lowranceusr_fread(&buff[0], 4, 1, file_in);
-                       wpt_tmp->latitude = lat_mm_to_deg(le_read32(&buff[0]));
-                       lowranceusr_fread(&buff[0], 4, 1, file_in);
-                       wpt_tmp->longitude = lon_mm_to_deg(le_read32(&buff[0]));
+                       wpt_tmp->latitude = lat_mm_to_deg(gbfgetint32(file_in));
+                       wpt_tmp->longitude = lon_mm_to_deg(gbfgetint32(file_in));
                        wpt_tmp->altitude = 0;
-                       sprintf(buff,"Icon %d", i+1);
+                       snprintf(buff, sizeof(buff), "Icon %d", i+1);
                        wpt_tmp->shortname = xstrdup(buff);
                        /* symbol */
-                       lowranceusr_fread(&buff[0], 4, 1, file_in);
-                       wpt_tmp->icon_descr = lowranceusr_find_desc_from_icon_number(le_read32(&buff[0]));
+                       wpt_tmp->icon_descr = lowranceusr_find_desc_from_icon_number(gbfgetint32(file_in));
                        waypt_add(wpt_tmp);
                }
        }
@@ -494,17 +466,16 @@ lowranceusr_parse_trails(void)
 {
        char buff[MAXUSRSTRINGSIZE + 1];
        short int num_trails, num_trail_points, num_section_points;
-       int i,j, trk_num;
-       long int text_len;
+       int i,j, trk_num, itmp;
+       int text_len;
        waypoint *wpt_tmp;
        route_head *trk_tmp;
 
        /* num trails */
-       lowranceusr_fread(&buff[0], 2, 1, file_in);
-       num_trails = le_read16(&buff[0]);
+       num_trails = gbfgetint16(file_in);
 
-    if (global_opts.debug_level >= 1)
-               printf("LOWRANCE parse_trails: num trails = %d\n", num_trails);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " parse_trails: num trails = %d\n", num_trails);
 
        for (i=trk_num=0; i < num_trails; i++)
        {
@@ -513,36 +484,33 @@ lowranceusr_parse_trails(void)
                track_add_head(trk_head);
 
                /* trail name */
-               lowranceusr_fread(&buff[0], 4, 1, file_in);
-               text_len = buff[0];
-
-if (global_opts.debug_level >= 1)
-       printf("LOWRANCE parse_trails: name text len = %ld\n", text_len);
+               text_len = lowranceusr_readstr(&buff[0], MAXUSRSTRINGSIZE, file_in);
 
-               if (text_len)
-                       lowranceusr_fread(&buff[0], text_len, 1, file_in);
+               if (global_opts.debug_level >= 1)
+                       printf(MYNAME " parse_trails: name text len = %d\n", text_len);
 
-               buff[text_len] = '\0';
-               trk_head->rte_name = xstrdup(buff);
+               if (text_len) {
+                       buff[text_len] = '\0';
+                       trk_head->rte_name = xstrdup(buff);
+               }
                trk_head->rte_desc = '\0';
 
-if (global_opts.debug_level >= 1)
-       printf("LOWRANCE parse_trails: trail name = %s\n", trk_head->rte_name);
+               if (global_opts.debug_level >= 1)
+                       printf(MYNAME " parse_trails: trail name = %s\n", trk_head->rte_name);
 
                /* visible */
-               lowranceusr_fread(&buff[0], 1, 1, file_in);
+               (void) gbfread(&buff[0], 1, 1, file_in);
                /* num trail points */
-               lowranceusr_fread(&buff[0], 2, 1, file_in);
-               num_trail_points = le_read16(&buff[0]);
+               num_trail_points = gbfgetint16(file_in);
 
-if (global_opts.debug_level >= 1)
-       printf("LOWRANCE parse_trails: num trail points = %d\n", num_trail_points);
+               if (global_opts.debug_level >= 1)
+                       printf(MYNAME " parse_trails: num trail points = %d\n", num_trail_points);
 
                /* max trail size */
-               lowranceusr_fread(&buff[0], 2, 1, file_in);
+               itmp = gbfgetint16(file_in);
 
-if (global_opts.debug_level >= 1)
-       printf("LOWRANCE parse_trails: max trail size = %d\n", le_read16(&buff[0]));
+               if (global_opts.debug_level >= 1)
+                       printf(MYNAME " parse_trails: max trail size = %d\n", itmp);
 
                if (num_trail_points)
                {
@@ -550,34 +518,31 @@ if (global_opts.debug_level >= 1)
                        while (num_trail_points)
                        {
                        /* num section points */
-                       lowranceusr_fread(&buff[0], 2, 1, file_in);
-                       num_section_points = le_read16(&buff[0]);
+                       num_section_points = gbfgetint16(file_in);
 
-if (global_opts.debug_level >= 1)
-       printf("LOWRANCE parse_trails: num section points = %d\n", num_section_points);
+                       if (global_opts.debug_level >= 1)
+                               printf(MYNAME " parse_trails: num section points = %d\n", num_section_points);
 
                                for (j=0; j < num_section_points; j++, num_trail_points--)
                                {
-                               wpt_tmp = waypt_new();
-                               lowranceusr_fread(&buff[0], 4, 1, file_in);
-                               wpt_tmp->latitude = lat_mm_to_deg(le_read32(&buff[0]));
-                               lowranceusr_fread(&buff[0], 4, 1, file_in);
-                               wpt_tmp->longitude = lon_mm_to_deg(le_read32(&buff[0]));
-                               /* continuous */
-                               lowranceusr_fread(&buff[0], 1, 1, file_in);
-                               if (!buff[0] && seg_break && j)
-                               {
-                                       trk_tmp = route_head_alloc();
-                                       trk_tmp->rte_num = ++trk_num;
-                                       trk_tmp->rte_name = xstrdup(trk_head->rte_name);
-                                       trk_tmp->rte_desc = '\0';
-                                       track_add_head(trk_tmp);
-                                       trk_head = trk_tmp;
-                               }
-                               track_add_wpt(trk_head, wpt_tmp);
+                                       wpt_tmp = waypt_new();
+                                       wpt_tmp->latitude = lat_mm_to_deg(gbfgetint32(file_in));
+                                       wpt_tmp->longitude = lon_mm_to_deg(gbfgetint32(file_in));
+                                       /* continuous */
+                                       (void) gbfread(&buff[0], 1, 1, file_in);
+                                       if (!buff[0] && seg_break && j)
+                                       {
+                                               trk_tmp = route_head_alloc();
+                                               trk_tmp->rte_num = ++trk_num;
+                                               trk_tmp->rte_name = xstrdup(trk_head->rte_name);
+                                               trk_tmp->rte_desc = '\0';
+                                               track_add_head(trk_tmp);
+                                               trk_head = trk_tmp;
+                                       }
+                                       track_add_wpt(trk_head, wpt_tmp);
                        
-if (global_opts.debug_level >= 1)
-       printf("LOWRANCE parse_trails: Trail pt lat %f lon %f\n", wpt_tmp->latitude, wpt_tmp->longitude);
+                                       if (global_opts.debug_level >= 1)
+                                               printf(MYNAME " parse_trails: Trail pt lat %f lon %f\n", wpt_tmp->latitude, wpt_tmp->longitude);
                                }
                        }
                }
@@ -589,27 +554,23 @@ if (global_opts.debug_level >= 1)
 static void
 data_read(void)
 {
-       char buff[MAXUSRSTRINGSIZE + 1];
        short int NumWaypoints, MajorVersion, MinorVersion, object_num;
        int i;
 
-       lowranceusr_fread(&buff[0], 2, 1, file_in);
-       MajorVersion = le_read16(&buff[0]);
-       lowranceusr_fread(&buff[0], 2, 1, file_in);
-       MinorVersion = le_read16(&buff[0]);
+       MajorVersion = gbfgetint16(file_in);
+       MinorVersion = gbfgetint16(file_in);
        
        if (global_opts.debug_level >= 1)
-               printf("LOWRANCE data_read: Major Version %d Minor Version %d\n", MajorVersion, MinorVersion);
+               printf(MYNAME " data_read: Major Version %d Minor Version %d\n", MajorVersion, MinorVersion);
 
        if (MajorVersion < 2) {
                fatal(MYNAME ": input file is from an old version of the USR file and is not supported\n");
        }
 
-       lowranceusr_fread(&buff[0], 2, 1, file_in);
-       NumWaypoints = le_read16(&buff[0]);
+       NumWaypoints = gbfgetint16(file_in);
 
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE data_read: Num waypoints %d\n", NumWaypoints);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " data_read: Num waypoints %d\n", NumWaypoints);
 
        for (i = 0; i < NumWaypoints; i++) {
                waypoint *wpt_tmp;
@@ -617,10 +578,9 @@ data_read(void)
                wpt_tmp = waypt_new();
 
                /* Object num */
-               lowranceusr_fread(&buff[0], 2, 1, file_in);
-               object_num = le_read16(&buff[0]);
+               object_num = gbfgetint16(file_in);
                if (global_opts.debug_level >= 1)
-                       printf("LOWRANCE data_read: object_num = %d\n", object_num);
+                       printf(MYNAME " data_read: object_num = %d\n", object_num);
 
                /* waypoint */
                lowranceusr_parse_waypt(wpt_tmp);
@@ -636,7 +596,7 @@ data_read(void)
 static void
 lowranceusr_waypt_disp(const waypoint *wpt)
 {
-       int TextLen, Lat, Lon, Time, SymbolId;
+       int text_len, Lat, Lon, Time, SymbolId;
        short int WayptType;
        char *name;
        char *comment;
@@ -647,13 +607,13 @@ lowranceusr_waypt_disp(const waypoint *wpt)
        }
 
        Lat = lat_deg_to_mm(wpt->latitude);
-       my_fwrite4(&Lat, file_out);
        Lon = lon_deg_to_mm(wpt->longitude);
-       my_fwrite4(&Lon, file_out);
-       my_fwrite4(&alt, file_out);
+       gbfputint32(Lat, file_out);
+       gbfputint32(Lon, file_out);
+       gbfputint32(alt, file_out);
 
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE waypt_disp: Lat = %d\nLon = %d\nAlt = %d\n",Lat, Lon, alt);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " waypt_disp: Lat = %d\nLon = %d\nAlt = %d\n",Lat, Lon, alt);
 
        /* Try and make sure we have a name */
        if ((! wpt->shortname) || global_opts.synthesize_shortnames) {
@@ -670,12 +630,13 @@ lowranceusr_waypt_disp(const waypoint *wpt)
                name = xstrdup(wpt->shortname);
        }
 
-       TextLen = strlen(name);
-       my_fwrite4(&TextLen, file_out);
-       fwrite(name, 1, TextLen, file_out);
+       text_len = strlen(name);
+       if (text_len > MAXUSRSTRINGSIZE) text_len = MAXUSRSTRINGSIZE;
+       gbfputint32(text_len, file_out);
+       gbfwrite(name, 1, text_len, file_out);
 
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE waypt_disp: Waypt name = %s\n",name);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " waypt_disp: Waypt name = %s\n",name);
 
        xfree(name);
 
@@ -684,13 +645,14 @@ lowranceusr_waypt_disp(const waypoint *wpt)
         */
        if (wpt->description && strcmp(wpt->description, wpt->shortname) != 0) {
                comment = xstrdup(wpt->description);
-               TextLen = strlen(comment);
-               my_fwrite4(&TextLen, file_out);
-               fwrite(comment, 1, TextLen, file_out);
+               text_len = strlen(comment);
+               if (text_len > MAXUSRSTRINGSIZE) text_len = MAXUSRSTRINGSIZE;
+               gbfputint32(text_len, file_out);
+               gbfwrite(comment, 1, text_len, file_out);
                xfree(comment);
        } else {
-               TextLen = 0;
-               my_fwrite4(&TextLen, file_out);
+               text_len = 0;
+               gbfputint32(text_len, file_out);
        }
 
        if (wpt->creation_time > base_time_secs) {
@@ -699,16 +661,16 @@ lowranceusr_waypt_disp(const waypoint *wpt)
                Time = 0;
        }
 
-    if (global_opts.debug_level >= 2)
+       if (global_opts.debug_level >= 2)
        {
                time_t wpt_time = Time;
-               printf("LOWRANCE waypt_disp: base_time : %d\n", (int)base_time_secs);
-               printf("LOWRANCE waypt_disp: creation time : %d\n", (int)wpt->creation_time);
-               printf("LOWRANCE waypt_disp: waypt time : %d\n", (int)wpt_time);
-               printf("LOWRANCE waypt_disp: waypt time (local): %s\n", ctime(&wpt_time));
+               printf(MYNAME " waypt_disp: base_time : %d\n", (int)base_time_secs);
+               printf(MYNAME " waypt_disp: creation time : %d\n", (int)wpt->creation_time);
+               printf(MYNAME " waypt_disp: waypt time : %d\n", (int)wpt_time);
+               printf(MYNAME " waypt_disp: waypt time (local): %s\n", ctime(&wpt_time));
        }
 
-       my_fwrite4(&Time, file_out);
+       gbfputint32(Time, file_out);
 
        if (get_cache_icon(wpt) && wpt->icon_descr && (strcmp(wpt->icon_descr, "Geocache Found") != 0)) {
                SymbolId = lowranceusr_find_icon_number_from_desc(get_cache_icon(wpt));
@@ -716,11 +678,11 @@ lowranceusr_waypt_disp(const waypoint *wpt)
                SymbolId = lowranceusr_find_icon_number_from_desc(wpt->icon_descr);
        }
 
-       my_fwrite4(&SymbolId, file_out);
+       gbfputint32(SymbolId, file_out);
 
        /* USER waypoint type */
        WayptType = 0;
-       my_fwrite2(&WayptType, file_out);
+       gbfputint16(WayptType, file_out);
 }
 
 static void
@@ -728,10 +690,10 @@ lowranceusr_waypt_pr(const waypoint *wpt)
 {
 
        /* our personal waypoint counter */
-       my_fwrite2((short *) &waypt_out_count, file_out);
+       gbfputint16(waypt_out_count, file_out);
 
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE waypt_pr: waypoint #%d ",waypt_out_count);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " waypt_pr: waypoint #%d ",waypt_out_count);
 
        waypt_out_count++;
 
@@ -755,9 +717,9 @@ lowranceusr_write_icon(const waypoint *wpt)
                lowranceusr_find_icon_number_from_desc(wpt->icon_descr) :
                10003;
 
-       my_fwrite4(&latmm, file_out);
-       my_fwrite4(&lonmm, file_out);
-       my_fwrite4(&icon, file_out);
+       gbfputint32(latmm, file_out);
+       gbfputint32(lonmm, file_out);
+       gbfputint32(icon, file_out);
 }
 
 /*
@@ -791,19 +753,20 @@ lowranceusr_track_hdr(const route_head *trk)
        } else
        {
                tmp_name[0]='\0';
-               sprintf(tmp_name, "Babel %d", trail_count);
+               snprintf(tmp_name, sizeof(tmp_name), "Babel %d", trail_count);
                name = xstrdup(tmp_name);
        }
 
        text_len = strlen(name);
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE track_hdr: trail name text len = %d\n", text_len);
-       my_fwrite4(&text_len, file_out);
+       if (text_len > MAXUSRSTRINGSIZE) text_len = MAXUSRSTRINGSIZE;
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " track_hdr: trail name text len = %d\n", text_len);
+       gbfputint32(text_len, file_out);
 
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE track_hdr: trail name = %s\n", name);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " track_hdr: trail name = %s\n", name);
 
-       fwrite(name, 1, text_len, file_out);
+       gbfwrite(name, 1, text_len, file_out);
 
        num_trail_points = (short) trk->rte_waypt_ct;
        max_trail_size = MAX_TRAIL_POINTS;
@@ -811,14 +774,14 @@ lowranceusr_track_hdr(const route_head *trk)
                num_trail_points = max_trail_size;
        num_section_points = num_trail_points;
 
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE track_hdr: num_trail_points = %d\nmax_trail_size = %d\nnum_section_points = %d\n",
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " track_hdr: num_trail_points = %d\nmax_trail_size = %d\nnum_section_points = %d\n",
                        num_trail_points, max_trail_size, num_section_points);
 
-       fwrite(&visible, 1, 1, file_out);
-       my_fwrite2(&num_trail_points, file_out);
-       my_fwrite2(&max_trail_size, file_out);
-       my_fwrite2(&num_section_points, file_out);
+       gbfwrite(&visible, 1, 1, file_out);
+       gbfputint16(num_trail_points, file_out);
+       gbfputint16(max_trail_size, file_out);
+       gbfputint16(num_section_points, file_out);
        xfree(name);
        trail_point_count=1;
 }
@@ -839,21 +802,22 @@ lowranceusr_route_hdr(const route_head *rte)
        } else
        {
                tmp_name[0]='\0';
-               sprintf(tmp_name, "Babel R%d", ++lowrance_route_count);
+               snprintf(tmp_name, sizeof(tmp_name), "Babel R%d", ++lowrance_route_count);
                name = xstrdup(tmp_name);
        }
        text_len = strlen(name);
-       my_fwrite4(&text_len, file_out);
-       fwrite(name, 1, text_len, file_out);
+       if (text_len > MAXUSRSTRINGSIZE) text_len = MAXUSRSTRINGSIZE;
+       gbfputint32(text_len, file_out);
+       gbfwrite(name, 1, text_len, file_out);
        xfree(name);
 
        /* num legs */
        num_legs = (short) rte->rte_waypt_ct;
-       my_fwrite2(&num_legs, file_out);
-       fwrite(&route_reversed, 1, 1, file_out);
+       gbfputint16(num_legs, file_out);
+       gbfwrite(&route_reversed, 1, 1, file_out);
 
-    if (global_opts.debug_level >= 1)
-               printf("LOWRANCE route_hdr: route name \"%s\" num_legs = %d\n",
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " route_hdr: route name \"%s\" num_legs = %d\n",
                        rte->rte_name, num_legs);
 
 }
@@ -868,12 +832,12 @@ lowranceusr_track_disp(const waypoint *wpt)
                lat = lat_deg_to_mm(wpt->latitude);
                lon = lon_deg_to_mm(wpt->longitude);
 
-    if (global_opts.debug_level >= 1)
-               printf("LOWRANCE track_disp: Trail point #%d lat = %d long = %d\n",trail_point_count, lat, lon);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " track_disp: Trail point #%d lat = %d long = %d\n",trail_point_count, lat, lon);
 
-               my_fwrite4(&lat, file_out);
-               my_fwrite4(&lon, file_out);
-               fwrite(&continuous, 1, 1, file_out);
+               gbfputint32(lat, file_out);
+               gbfputint32(lon, file_out);
+               gbfwrite(&continuous, 1, 1, file_out);
                if (!continuous)
                        continuous = 1;
        }
@@ -894,16 +858,17 @@ lowranceusr_merge_track_hdr(const route_head *trk)
                } else
                {
                        tmp_name[0]='\0';
-                       sprintf(tmp_name, "Babel %d", trail_count);
+                       snprintf(tmp_name, sizeof(tmp_name), "Babel %d", trail_count);
                        name = xstrdup(tmp_name);
                }
                text_len = strlen(name);
-               my_fwrite4(&text_len, file_out);
+               if (text_len > MAXUSRSTRINGSIZE) text_len = MAXUSRSTRINGSIZE;
+               gbfputint32(text_len, file_out);
 
                if (global_opts.debug_level >= 1)
-                       printf("LOWRANCE track_hdr: trail name = %s\n", name);
+                       printf(MYNAME " track_hdr: trail name = %s\n", name);
 
-               fwrite(name, 1, text_len, file_out);
+               gbfwrite(name, 1, text_len, file_out);
        }
 
        trail_point_count += (short) trk->rte_waypt_ct;
@@ -923,14 +888,14 @@ lowranceusr_merge_track_tlr(const route_head *trk)
                        num_trail_points = max_trail_size;
                num_section_points = num_trail_points;
 
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE merge_track_tlr: num_trail_points = %d\nmax_trail_size = %d\nnum_section_points = %d\n",
-                       num_trail_points, max_trail_size, num_section_points);
+               if (global_opts.debug_level >= 1)
+                       printf(MYNAME " merge_track_tlr: num_trail_points = %d\nmax_trail_size = %d\nnum_section_points = %d\n",
+                               num_trail_points, max_trail_size, num_section_points);
 
-               fwrite(&visible, 1, 1, file_out);
-               my_fwrite2(&num_trail_points, file_out);
-               my_fwrite2(&max_trail_size, file_out);
-               my_fwrite2(&num_section_points, file_out);
+               gbfwrite(&visible, 1, 1, file_out);
+               gbfputint16(num_trail_points, file_out);
+               gbfputint16(max_trail_size, file_out);
+               gbfputint16(num_section_points, file_out);
        }
 }
 static void
@@ -950,26 +915,26 @@ data_write(void)
 
        NumWaypoints = waypt_count();
 
-       my_fwrite2(&MajorVersion, file_out);
-       my_fwrite2(&MinorVersion, file_out);
+       gbfputint16(MajorVersion, file_out);
+       gbfputint16(MinorVersion, file_out);
 
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE data_write: Num waypoints = %d\n", NumWaypoints);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " data_write: Num waypoints = %d\n", NumWaypoints);
 
-    if (writeasicons) {
-           short zero = 0;
-           my_fwrite2(&zero, file_out);
-    } else {
-           my_fwrite2(&NumWaypoints, file_out);
-           waypt_disp_all(lowranceusr_waypt_pr);
-    }
+       if (writeasicons) {
+               short zero = 0;
+               gbfputint16(zero, file_out);
+       } else {
+               gbfputint16(NumWaypoints, file_out);
+               waypt_disp_all(lowranceusr_waypt_pr);
+       }
 
-    /* Route support added 6/21/05 */
-    NumRoutes = route_count();
-    my_fwrite2(&NumRoutes, file_out);
+       /* Route support added 6/21/05 */
+       NumRoutes = route_count();
+       gbfputint16(NumRoutes, file_out);
 
-    if (global_opts.debug_level >= 1)
-       printf("LOWRANCE data_write: Num routes = %d\n", NumRoutes);
+       if (global_opts.debug_level >= 1)
+               printf(MYNAME " data_write: Num routes = %d\n", NumRoutes);
 
        if (NumRoutes)
        {
@@ -978,11 +943,11 @@ data_write(void)
        }
 
        if (NumWaypoints && writeasicons) {
-               my_fwrite2(&NumWaypoints, file_out);
+               gbfputint16(NumWaypoints, file_out);
                waypt_disp_all(lowranceusr_write_icon);
        } else {
                NumIcons = 0;
-               my_fwrite2(&NumIcons, file_out);
+               gbfputint16(NumIcons, file_out);
        }
        
        /* Track support added 6/21/05 */
@@ -991,7 +956,7 @@ data_write(void)
        if (NumTrails && merge)
        {
                NumTrails = 1;
-               my_fwrite2(&NumTrails, file_out);
+               gbfputint16(NumTrails, file_out);
                trail_point_count = 0;
                trail_count = 0;
                /* count the number of total track points */
@@ -1004,10 +969,10 @@ data_write(void)
        else
        {
        
-               my_fwrite2(&NumTrails, file_out);
+               gbfputint16(NumTrails, file_out);
 
                if (global_opts.debug_level >= 1)
-               printf("LOWRANCE data_write: Num tracks = %d\n", NumTrails);
+                       printf(MYNAME " data_write: Num tracks = %d\n", NumTrails);
 
                if (NumTrails)
                {